#include "wxsenumproperty.h"

#include <globals.h>
#include <prep.h>

#define VALUE   wxsVARIABLE(Object,Offset,long)

wxsEnumProperty::wxsEnumProperty( const wxString& PGName, const wxString& DataName, long _Offset, const long* _Values, const wxChar** _Names, bool _UpdateEntries, long _Default, bool _UseNamesInXml, int Priority ):
  wxsProperty( PGName, DataName, Priority ),
  Offset( _Offset ),
  Default( _Default ),
  UpdateEntries( _UpdateEntries ),
  Values( _Values ),
  Names( _Names ),
  UseNamesInXml( _UseNamesInXml ) {}


void wxsEnumProperty::PGCreate( wxsPropertyContainer* Object, wxPropertyGridManager* Grid, wxPGId Parent ) {
  wxPGChoices PGC( Names, Values );
  PGRegister( Object, Grid, Grid->AppendIn( Parent, new wxEnumProperty( GetPGName(), wxPG_LABEL, PGC, VALUE ) ) );
}

bool wxsEnumProperty::PGRead( M_Code_unused wxsPropertyContainer* Object, wxPropertyGridManager* Grid, wxPGId Id, M_Code_unused long Index ) {
  VALUE = Grid->GetPropertyValue( Id ).GetLong();
  return true;
}

bool wxsEnumProperty::PGWrite( wxsPropertyContainer* Object, wxPropertyGridManager* Grid, wxPGId Id, M_Code_unused long Index ) {
  if( UpdateEntries ) {
    Grid->GetPropertyChoices( Id ).Set( Names, Values );
  }
  Grid->SetPropertyValue( Id, VALUE );
  return true;
}

bool wxsEnumProperty::XmlRead( M_Code_unused wxsPropertyContainer* Object, TiXmlElement* Element ) {
  if( !Element ) {
    VALUE = Default;
    return false;
  }
  const char* Text = Element->GetText();
  if( !Text ) {
    VALUE = Default;
    return false;
  }
  if( UseNamesInXml ) {
    wxString TextS = cbC2U( Text );
    int i = 0;
    for( const wxChar** Ptr = Names; *Ptr; Ptr++, i++ ) {
      if( TextS == *Ptr ) {
        VALUE = Values[i];
        return true;
      }
    }
    VALUE = Default;
    return false;;
  } else {
    VALUE = atoi( Text );
  }
  return true;
}

bool wxsEnumProperty::XmlWrite( M_Code_unused wxsPropertyContainer* Object,
                                TiXmlElement* Element ) {
  if( VALUE != Default ) {
    if( UseNamesInXml ) {
      int i = 0;
      for( const wxChar** Ptr = Names; *Ptr; Ptr++, i++ ) {
        if( VALUE == Values[i] ) {
          Element->InsertEndChild( TiXmlText( cbU2C( *Ptr ) ) );
          return true;
        }
      }
    }
    Element->InsertEndChild( TiXmlText( cbU2C( wxString::Format( _T( "%ld" ), VALUE ) ) ) );
    return true;
  }
  return false;
}

bool wxsEnumProperty::PropStreamRead( M_Code_unused wxsPropertyContainer* Object,
                                      wxsPropertyStream* Stream ) {
  return Stream->GetLong( GetDataName(), VALUE, Default );
}

bool wxsEnumProperty::PropStreamWrite( M_Code_unused wxsPropertyContainer* Object,
                                       wxsPropertyStream* Stream ) {
  return Stream->PutLong( GetDataName(), VALUE, Default );
}
